﻿USE [uvp]
GO

--alter table s_xml add HexArray nvarchar(max);
alter table s_xml add IP nvarchar(30);
go

/****** Object:  StoredProcedure [dbo].[sp_sub_LoadLogData]    Script Date: 08/19/2013 00:06:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
	说明：解析xml包，存入子网缓存数据表；并将警报信息插入警报表（有则不插）
	编写：梁宁 2011-03-11
	-----------------------------
	修改：[liangning  2012-09-1 ]将该过程，修改为适应CET的二代现场主机的数据采集。
		  [liangning  2013-07-21]加字段HexArray，保存16进制包。
*/
ALTER proc [dbo].[sp_sub_LoadLogData]	
	@Mac nvarchar(40),
	@IP nvarchar(40),
	@dtm datetime,
	@xmldata nvarchar(max),
	@hexArray  nvarchar(max)=null,
	@general tinyint=2 --默认2带机,
	,@islogxml bit=1 --默认不记录xml数据
as 
begin 
	DECLARE @idoc int;
	DECLARE @doc nvarchar(1000)	;
	DECLARE @errorMsg nvarchar(500);
	--事务开始
	begin tran 
	--try 开始
	begin try 
	--Create an internal representation of the XML document.
	EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldata

	--取电池信息,存入临时表
	declare @temptbl table (g nvarchar(30),n int,v numeric(12,2),ir numeric(12,2),t numeric(12,2),cf numeric(12,2), sn int,s nvarchar(100),f bit)
	insert into @temptbl(g,n,v,ir,t,cf,sn,s,f)
	SELECT g,n,v,ir,t,cf,sn,s,f 
	FROM OPENXML (@idoc, '/data/r',2)----注意大小写!!
				WITH (g nvarchar(30), --电池组
					  n int,  --电池号
					  v numeric(12,2),--电压
					  ir numeric(12,2),--内阻
					  t numeric(12,2),--温度
					  cf numeric(12,2),--剩余容量
					  sn int, --状态编号
					  s nvarchar(100), --状态文本
				      f bit -- 是否报警（0否，1是）
				)
	
	--(1)插入缓冲表
	insert into dbo.S_BatBuffer with(holdlock) (Generation,EquipID,BatteryGroup,BatteryID,Vval,Rval,Tval,Capacity,StatusNO,[Status],LogTime)
	SELECT @general,@Mac,g,n,v,ir,t,cf,sn,s,@dtm FROM @temptbl


	--(2)电池 插入警报表(若同一块电池已报警，则不再重复插入;警报记录由手工处理模块,加标记)	
	
	insert into dbo.S_Warning with(holdlock) (EquipID,BatteryGroup,BatteryID,WarningTime,WarningNO,WarningStatus)
		SELECT @Mac,g,n,@dtm,sn,s FROM @temptbl t 
		  where t.f=1 and not exists(select 1 from dbo.S_Warning w with(nolock) where
		 IsActive=1 and w.EquipID=@Mac and w.BatteryGroup=t.g and w.BatteryID=t.n and w.WarningNO=t.sn )
	
	--(2.1)电池 更新警报表
	Update dbo.S_Warning with(holdlock) set WarningTime=@dtm FROM @temptbl t 
	 where t.f=1 and IsActive=1 and EquipID=@Mac and BatteryGroup=t.g and BatteryID=t.n and WarningNO=t.sn 

	--取电池组信息，存入临时表
	declare @grptbl table(g nvarchar(30), v numeric(12,2),i numeric(12,2),s nvarchar(30),sn tinyint,e nvarchar(100), 
		en int,	iocp numeric(12,2),iotl nvarchar(20), cf numeric(12,2), tf nvarchar(20),boundary nvarchar(1000),f bit 
	)
	insert into @grptbl(g , v ,i ,s ,sn ,e , en ,iocp ,iotl , cf , tf, boundary ,f)
	SELECT g,v,i,s,sn,e,en,iocp,iotl,cf,tf,boundary,f 
	FROM OPENXML (@idoc, '/data/G',2) --注意大小写!!
					WITH (g nvarchar(30), --电池组					 
						  v numeric(12,2),--总电压
						  i numeric(12,2),--总电流
						  s nvarchar(30), --状态文本
						  sn tinyint,	--状态编号
						  e nvarchar(100), --错误文本
						  en int,	-- 错误编号
						  iocp numeric(12,2),--充放容量
						  iotl nvarchar(20), --充放时长
						  cf numeric(12,2),--剩余容量
						  tf nvarchar(20),--剩余可用时间
						  boundary nvarchar(1000),--边界值xml
						  f bit --是否报警（0否，1是）
					)
	--(3)插入电池组缓冲表
	insert into dbo.S_BatgrpBuffer with(holdlock)(Generation,EquipID,BatteryGroup,Vval,Ival,CdFree,CdTime,CapFree,TimeFree,WorkStatus,WarningContent,[Status],WarningContentDescr,BoundaryInfo,LogTime)
	SELECT @general,@Mac,g,v,i,iocp,iotl,cf,tf,sn,en,s,e,boundary,@dtm
	FROM @grptbl
	
	--(4)电池组 插入警报表(若同一电池组已报警，则不再重复插入;警报记录由手工处理模块,加标记)	
		insert into dbo.S_Warning(EquipID,BatteryGroup,BatteryID,WarningTime,WarningNO,WarningStatus)
			SELECT @Mac,g,-1,@dtm,en,e FROM @grptbl t 
			  where t.f=1 and not exists(select 1 from dbo.S_Warning w with( nolock)  where
			 IsActive=1 and w.BatteryID=-1 and w.EquipID=@Mac and w.BatteryGroup=t.g and w.WarningNO=t.en
				)
	
	--(4.1)电池组 更新记录
	Update dbo.S_Warning with(holdlock) set WarningTime=@dtm FROM @grptbl t 
	 where t.f=1 and IsActive=1 and EquipID=@Mac and BatteryGroup=t.g and BatteryID=-1 and WarningNO=t.en 
		
	/*
	--(5)更新主机Mac和IP的对应关系,及其他现场主机信息
		declare @ent numeric(12,2);declare @RatedCapacity numeric(12,2);		
		SELECT @ent=ent,@RatedCapacity=cd
		FROM OPENXML (@idoc, '/data/P',2) --注意大小写!!
						WITH (ent numeric(12,2), --环境温度					 
							  cd numeric(12,2)-- 额定容量
		)
		exec sp_SaveHostIPMac @Mac,@IP,@dtm,@ent,@RatedCapacity
	*/
	--try 结束
	end try
	begin catch
		if(@@trancount>0) 
			begin
				print('rollback! ');
				rollback tran --回滚事务
				--记录消息
				set @errorMsg ='Error:'+ERROR_MESSAGE();
			end
	end catch

	if(@@trancount>0) 
	begin
		print('commit! ');
		commit tran --提交事务		
		set @errorMsg='OK';
	end

	if(@islogxml=1) begin
		-- 插入xml日志
		insert into dbo.S_Xml(DataXml,Error,HexArray,Ip) values(@xmldata,@errorMsg,@hexArray,@IP);
	end 
end


